package peace.data {

public class Interval {

    public var min:Number;
    public var max:Number;

    public function Interval(min:Number = 0, max:Number = 0) {
        this.min = min;
        this.max = max;
    }

    public function get length():Number {
        return max - min;
    }

    /**
     * @param n
     * @param includeBorders может ли быть равен min или max
     * @return
     */
    public function contains(n:Number, includeBorders:Boolean = true):Boolean {
        return includeBorders ? min <= n && max >= n : min < n && max > n;
    }

    /**
     * Обрезаем число до границы интервала, если оно не входит в интервал. <br>
     * Иначе ничего не происходит.
     *
     * @param n
     * @return
     */
    public function crop(n:Number):Number {
        if (n < min) n = min;
        else if (n > max) n = max;
        return n;
    }

    /**
     * @param interval Interval
     * @return
     */
    public function equals(interval:Interval):Boolean {
        if (interval == this) return true;
        return interval.min == min && interval.max == max;
    }

    /**
     * Ищем пересечение отрезков
     *
     * @param interval Interval
     * @return Interval или null
     *
     */
    public function intersect(interval:Interval):Interval {
        if (interval.max < min || interval.min > max) return null;
        return new Interval(Math.max(interval.min, min), Math.min(interval.max, max));
    }

    /**
     * Суммируем с другим интервалом при наличии пересечения. <br>
     * Иначе ничего не делаем и возвращаем null
     *
     * @param interval новый интервал или null
     *
     */
    public function add(interval:Interval):Interval {
        if (interval.max < min || interval.min > max) return null;
        return new Interval(Math.min(interval.min, min), Math.max(interval.max, max));
    }

    public function clone():Interval {
        return new Interval(min, max);
    }

    public function toString():String {
        return "min:" + min + ", max:" + max;
    }
}
}